import axios from "axios";
// import router from "../router"
import store from "@/store";
import { ElMessage } from "element-plus";
// 错误提示
const errorTip = msg => {
  ElMessage.error({
    message: msg,
    duration: 2000,
    center: true
  });
};

// 创建axios实例
var instance = axios.create({ timeout: 1000 * 8 });

/*
前后端约定入参格式
1、json
    后端接收json格式参数，前端无需特殊配置；
    例：axios.post(url, obj)
    axios内部会自动对Object的入参进行转换，转换成json字符串，同时，会指定Content-type为applicaltion/json。
2、传统入参方式 【application/x-www-form-urlencoded】
    后端接收a=1&b=2&c=3格式参数
    前端需要配置请求头：.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
    前端需要将参数序列化，qs模块在引入axios时自动携带，无需自主npm下载，直接`import qs from 'qs';`应用即可
*/
// 设置post请求头
// instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    const token = store.getters.token;
    token && (config.headers.Authorization = token);
    return config;
  },
  error => Promise.error(error)
);

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功
  res => {
    if (res.data.errCode === 0) {
      return Promise.resolve(res.data);
    } else {
      console.log(res);
      errorTip("请求出错");
      return Promise.reject(res);
    }
  },
  // res.data.errCode === 0 ? Promise.resolve(res.data) : errorTip("请求失败"),Promise.reject(res),
  // 请求失败
  error => {
    errorTip("请求失败");
    return Promise.reject(error);
  }
);

export default instance;
